#/usr/bin/python
# -*- coding: utf-8 -*-
# @Time    : 2018/10/26 12:12
# @Author  : xuyanbin
# @Email   : xuyanbin-x@163.com
import oss2
import os
import logging
'''
在centos中执行该文件，即可备份oss中指定Bucket的所有内容，可自动判断OSS中文件夹、文件，在本地目录中进行创建
，目录结构与oss的bucket中目录结构一致。
本例下载位置是'/data/pft_oss_back/'
python2执行即可
'''
auth = oss2.Auth('LTAI27GnxNo87Vou','xjf8CeimFC53qJ0GLiFUbquHMQqda1')
bucket = oss2.Bucket(auth,'http://oss-cn-shanghai.aliyuncs.com/NAMS','test50')
# bucket.get_object_to_file('NAMS/','.')   #下载文件

#配置日志路径和日志级别
logging.basicConfig(level=logging.DEBUG,
                    filename= 'test_redis.log',
                    format="%(asctime)s %(name)s %(levelname)s %(message)s",
                    datefmt='%Y-%m-%d  %H:%M:%S %a'  # 注意月份和天数不要搞乱了，这里的格式化符与time模块相同
                    )

try:
    # 设置Delimiter参数为正斜线（/）。
    for obj in oss2.ObjectIterator(bucket, delimiter = '/'):
        # 通过is_prefix方法判断obj是否为文件夹。
        if obj.is_prefix():  # 文件夹
            # print('directory: ' + obj.key,type(obj.key))

            for i in oss2.ObjectIterator(bucket,obj.key):
                path1 = '/data/pft_oss_back/%s'%i.key   #要下载的文件
                if  path1.endswith('/'): #判断得到的是目录还是文件，以'/'结尾为目录
                    if not  os.path.exists(path1): #判断目录是否存在，不存在创建目录
                        os.makedirs(path1,0755)
                        print('makedir is directory',path1)
                        logging.info('makedir is directory',path1)
                else:        #判断是文件，下载
                    if not os.path.exists(os.path.dirname(path1)):  # 针对有时候先得到目录里文件，后得到目录进行处理，将路径的目录获取，判断。没有则创建。
                        os.makedirs(os.path.dirname(path1),0755)
                        print('mkdirs is directory',os.path.dirname(path1))
                        logging.info('mkdirs is directory',os.path.dirname(path1))
                    if not os.path.isfile(path1):  #判断文件是否存在，存在返回true  不存在返回False。这里不存在的时候才下载
                      #  print(path1)
                        bucket.get_object_to_file(i.key,path1)
                        print('down file',path1)
                        logging.info('down file',path1)
        else:                # 文件
    #        print('file: ' + obj.key)
            path2 = '/data/pft_oss_back/%s'%obj.key
            if not os.path.isfile(path2):
               # print(path2)
                bucket.get_object_to_file(obj.key, path2)
                print('down file',path2)
                logging.info('down file',path2)
except Exception as e:
    logging.error(e)
    os.system('')   #程序报错，执行微信告警脚本